package com.javathread.th2.forkjoin;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

/**
 * 类说明: 查找指定目录(含子目录)找寻指定类型文件
 * demo 查找 H盘下 所有的 txt文本文件
 * 查找 png文件
 * @author Administrator
 *
 */
public class FindDirsFiles extends RecursiveAction {
	
	private File path;//当前任务需要搜寻的目录
	
	public FindDirsFiles(File path) {
		this.path = path;
	}
	
	public static void main(String[] args) {
		try {
		ForkJoinPool pool = new ForkJoinPool();
		FindDirsFiles task = new FindDirsFiles(new File("H:/"));
		pool.execute(task);//异步调用
		
		System.out.println("Task is Running......");
		
			Thread.sleep(1);
			int otherWork = 0;
			for (int i = 0; i < 100; i++) {
				otherWork = otherWork + i;
			}
			System.out.println("主线程 执行任务...,变量otherWork="+otherWork);
			task.join();//阻塞的方法
			System.out.println("任务执行完成");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	@Override
	protected void compute() {
		List<FindDirsFiles> subTasks = new ArrayList<>();
		File[] files = path.listFiles();
		if (files!=null) {
			for (File file:files) {
				if (file.isDirectory()) {
					subTasks.add(new FindDirsFiles(file));
				} else {
					//遇到文件,检查
					if (file.getAbsolutePath().endsWith("jpg")) {
						System.out.println("==文件:" + file.getAbsolutePath());
					}
				}
			}
			if (!subTasks.isEmpty()) {
				for (FindDirsFiles subTask:invokeAll(subTasks)) {
					subTask.join();//等待子任务执行完成
				}
			}
		}
	}

}
